/**
缓冲区Buffer是暂时存放输入输出数据的一段内存。
JS语言没有二进制数据类型，而在处理TCP和文件流的时候，必须要处理二进制数据。
NodeJS提供了一个Buffer对象来提供对二进制数据的操作
是一个表示固定内存分配的全局对象，也就是说要放到缓存区中的字节数需要提前确定
Buffer好比由一个8位字节元素组成的数组，可以有效的在JavasScript中表示二进制数据

字节(Byte)是计算机存储时的一种计量单位，一个字节等于8位二进制数
一个位就代表一个0或1，每8个位（bit）组成一个字节（Byte）
字节是通过网络传输信息的基本单位
一个字节最大值十进制数是255(2**8-1)
*/
//Buffer 代表一段内存 用来存储数据
//内存一旦申请好，就不能更改(大小)了
/** 为了将二进制的数据看起来短一点，Buffer采用了16进制*/

// console.log(255..toString(2));

//node 可以读取文件 文件是以二进制存储的
//我们读出来的数据都是二进制
//Buffer可以表示二进制 可以和字符串相互转化

//toString() slice()

const bf1 = Buffer.alloc(3);
console.log('bf1.length:',bf1.length); //3
console.log('bf1:',bf1); //bf1: <Buffer 00 00 00>

/** 可以直接用字符串来申请内存*/
/*const bf2 = Buffer.from('阿黄'); //默认是utf8编码
console.log('bf2',bf2); //bf2 <Buffer e9 98 bf e9 bb 84>
console.log('bf2.length:',bf2.length); //6 字节数*/

/** 也可以使用数组的方式具体指定Buffer里每个字节具体放什么*/
/*const bf3 = Buffer.from([100, 200, 0xff]); //会自动转成16进制
console.log('bf3',bf3); //bf3 <Buffer 64 c8 ff>*/


/** + 操作符*/
let buf1 = Buffer.from('地球');
let buf2 = Buffer.from('孙悟空');
console.log('buf1+buf2:', buf1 + buf2); //buf1+buf2: 地球孙悟空 ← so `+`操作符会将buffer连接起然后自动转换成字符串

//但我们有时并不希望它自动转化，只是想将buffer进行连接
//copy
const buf0 = Buffer.alloc(15); //3x5 5个中文字符的字节数
//buf1拷贝给buf0
buf1.copy(buf0, 0, 0, 6); //包前不包后
buf2.copy(buf0, 6, 0, 9);
console.log('buf0:',buf0);
// 😄
//原理
/*Buffer.prototype.copy = function (targetBuffer, targetStart, sourceStart, sourceEnd) {
  for(let i=0;i<sourceEnd-sourceStart;++i){
    targetBuffer[targetStart + i] = this[i];
  }
};*/

//但这样写还是比较麻烦
/** 我们可以使用Buffer.concat()方法*/

/*let newBuffer = Buffer.concat([buf1, buf2]);
console.log('newBuffer:', newBuffer);*/

//第二个参数是返回的新的buffer的长度，默认长度为buf1, buf2之和
let newBuffer = Buffer.concat([buf1, buf2],6);
console.log('newBuffer:', newBuffer);
console.log('newBuffer.toString():', newBuffer.toString());

/*
Buffer.concat = function (bufferList, len = bufferList.reduce((a, b) => a + b.length, 0)) {
  let buffer = Buffer.alloc(len);
  let offset = 0;
  bufferList.forEach(item => {
    item.copy(buffer, offset, 0, item.length);
    offset += item.length;
  });
  return buffer;
};
*/

//concat toString slice isBuffer(是不是buffer)

/** indexOf*/
/*const buffer = Buffer.from('ahhh我爱你');
console.log(buffer.indexOf('爱')); //7 ← 是按字节数算的
console.log(buffer.indexOf('h',2)); //从第二个字节开始找*/


/** split ← 官方未实现方法*/
//如果sep在开头或结尾 就会push一个空[]进去
/*Buffer.prototype.split = function (sep) {
  let arr = [];
  let offset = 0;
  let current = 0;
  let len = Buffer.from(sep).length;
  while (-1 !== (current = this.indexOf(sep,offset))){
    app.push(this.slice(offset, current));
    offset = current + len;
  }
  if(offset<this.length) arr.push(this.slice(offset));
  return arr;
};*/


//前端读文件的方法fileReader h5方法
